<?php 

/**
 * @file esse arquivo traz a interface
 */

// importacoes externas
module_load_include('inc', 'alunos');
module_load_include('inc', 'bolsas');
module_load_include('inc', 'modalidades');
module_load_include('inc', 'estaticos');

// importacoes internas
module_load_include('inc', 'dao', 'dao.aluno');
module_load_include('inc', 'dao', 'dao.bolsa');
module_load_include('inc', 'dao', 'dao.campus');
module_load_include('inc', 'dao', 'dao.curso');
module_load_include('inc', 'dao', 'dao.condicao');
module_load_include('inc', 'dao', 'dao.coordenador');
module_load_include('inc', 'dao', 'dao.modalidade');
module_load_include('inc', 'dao', 'dao.proreitoria');
module_load_include('inc', 'dao', 'dao.lab');
module_load_include('inc', 'dao', 'dao.banco');
module_load_include('inc', 'dao', 'dao.frequencia');
module_load_include('inc', 'dao', 'dao.tipo');

/**
 * Classe abstrata que concentra operacoes em comum com suas subclasses concretas
 * para acesso aos dados do banco
*/
abstract class DAO {
	
	var $type;
	
	/** construtor da classe */
	public function __construct($type) {
		$this->type = $type;
	}

	/** Adiciona um objeto ao banco*/
	public function add(&$objeto) {
		drupal_write_record($this->type, $objeto);
	}

	/** Remove um objeto do banco */
	public function remove($id, $chave_primaria = 'id') {
		db_delete($this->$type)
		->fields($this->$type)
		->condition($chave_primaria, $id)
		->execute();
	}

	/** Atualiza um objeto do banco */
	public function update($objeto, $chave_primaria = 'id') {
		drupal_write_record($this->type, $objeto, array($chave_primaria) );
	}

	/** Retorna o campo especifico de uma tabela */
	public function get_field($chave, $chave_data, $campo) {
		$query = db_select($this->type)
							->fields($this->type, array($campo) )
								->condition($chave, $chave_data)	
									->execute()->fetchAll();
		
		$result = '';
		foreach($query as $row) {
			$result = $row;
		}
		
		return $result;
	}
	
	/** Retorna o campo especifico de uma tabela */
	public function get_fields($chave, $chave_data, $campos) {
		$query = db_select($this->type)
		->fields($this->type, $campos )
		->condition($chave, $chave_data)
		->execute()->fetchAll();
	
		$result = '';
		foreach($query as $row) {
			$result = $row;
		}
	
		return $result;
	}
		
	/** Retorna um objeto identificado por sua id */
	public abstract function get($id);
	
	/** Lista uma tabela retornando uma lista de objetos */
	public abstract function listar();

	/**
	 * Retorna o DAO especifico de acordo com o argumento passado.
	 */
	static public function daoFactory($dao_type) {
		switch ($dao_type) {
			case Aluno::TYPE :
				return new DaoAluno($dao_type);

			case Bolsa::TYPE :
				return new DaoBolsa($dao_type);

			case Campus::TYPE :
				return new DaoCampus($dao_type);
					
			case Curso::TYPE:
				return new DaoCurso($dao_type);

			case Condicao::TYPE :
				return new DaoCondicao($dao_type);

			case Modalidade::TYPE :
				return new DaoModalidade($dao_type);

			case ProReitoria::TYPE :
				return new DaoProReitoria($dao_type);

			case Banco::TYPE :
				return new DaoBanco($dao_type);
					
			case Laboratorio::TYPE :
				return new DaoLaboratorio($dao_type);

			case TipoModalidade::TYPE:
				return new DaoTipoModalidade($dao_type);
				
			case 'frequencia':
				return new DaoFrequencia();
				
			case 'coordenador':
				return new DaoCoordenador();
				
			default:
				return NULL;
		}
		
	}

}
